common_path:= ../common
comunicacion=$(common_path)/comunicacion
thread=$(common_path)/thread
protocolo=$(comunicacion)/protocolo
general=$(common_path)/general
modelo=./modelo
controlador=./controlador

# Nombre del ejecutable
ejecutable= servidor
extension= cpp

DFLAGS=-Wall  -pedantic -pedantic-errors -Wextra -pedantic 
DFLAGS+= -Winit-self -Wredundant-decls -Wcast-align -Wundef -Wfloat-equal -Winline
DFLAGS+=-Wunreachable-code -Wmissing-declarations -Wmissing-include-dirs -Wswitch-enum -Wswitch-default
DFLAGS+=-Wmain
DFLAGS+= -Werror -Wfatal-errors  

# Para usar gdb
CFLAGS += -O3 -DNDEBUG

# Para valgrind o debug
CFLAGS += -ggdb -DDEBUG -fno-inline

CXX= g++ -std=c++98

LDFLAGS = -L /usr/lib

LDLIBS = -L /usr/lib -L /usr/lib/jsoncpp -ljsoncpp
LDLIBS+= -lpthread -pthread
LDLIBS+= -lcryptopp

fuentes ?= $(wildcard *.$(extension))
fuentes += $(wildcard $(common_path)/*.$(extension))
fuentes += $(wildcard $(comunicacion)/*.$(extension))
fuentes += $(wildcard $(protocolo)/*.$(extension))
fuentes += $(wildcard $(thread)/*.$(extension))
fuentes += $(wildcard $(general)/*.$(extension))
fuentes += $(wildcard $(modelo)/*.$(extension))
fuentes += $(wildcard $(modelo)/candies/*.$(extension))
fuentes += $(wildcard $(controlador)/*.$(extension))

OBJS=$(patsubst %.$(extension),%.o,$(fuentes))


INCLUDES=-I. -I$(common_path) -I$(comunicacion) -I$(protocolo) -I$(thread) -I$(general) -I$(modelo) -I$(modelo)/candies -I$(controlador)


.PHONY: clean valgrind

$(ejecutable): $(OBJS)
	$(CXX) $(DFLAGS) $(LDFLAGS)  $^ $(LDLIBS) -o $(ejecutable) 

%.o: %.$(extension)	
	$(CXX) $(DFLAGS) $(INCLUDES) -c $< -o $@ 

clean:
	rm -f servidor *.o $(common_path)/*.o $(common_path)/*.o $(general)/*.o $(comunicacion)/*.o $(thread)/*.o $(modelo)/*.o $(modelo)/candies/*.o $(controlador)/*.o $(ejecutable)

valgrind:
	valgrind -v --leak-check=full --track-origins=yes ./$(ejecutable)
